/**
 * 联动下拉选择脚本
 */

/*
调用方式：
layui.use(['linkSelect'],function(linkSelect){
    var linkConfig = {
        defname : ['请选择','请选择','请选择','请选择'],
        defval  : [],// [330000, 331100, 331127, 331127218 ],   对已知结果的设置 非必须
        url     : '/sys/area/getList',// '/syscode/ajaxcodelist',    联动请求网址
        urlparam: {},           // 请求的其他参数
        urlpid  : '',           // 请求下一级时 的服务器接收父级ID参数名称
        depth   : 4,            // 限制请求的展示的级别
        fname   : 'name',   // 原数据需要展示的字段名称
        fval    : 'code',   // 原数据需要提交的字段名称
        id      : $('#area'),   // 联动HTML 存放的div容器对象
        fromname: 'area',       // 提交表单的字段名称
        callfunc: '',           // 每次选择时触发率时的回调函数
    }
    linkSelect.setConfig(linkConfig);
})
*/

layui.define(["form","jquery","layer",'common'],function(exports){
    var form = layui.form,layer = layui.layer,
    $ = layui.jquery;
    var showMsg = function (msg,time){
        common.tip(msg,time);
    }
    
    var eventObject = function(o){
        var sysc = {
            gName : [], // 选中的数据名称
            gVal  : [], // 选中的数据值
        },
        c = {
            defname : ['请选择','请选择','请选择','请选择'],
            defval  : [],// [330000, 331100, 331127, 331127218 ],
            url     : '/sys/area/getlist',// '/syscode/ajaxcodelist',
            urlparam: {},           // 请求的其他参数
            urlpid  : '',           // 请求下一级时 的接收父级ID参数名称
            depth   : 4,            // 限制请求的展示的级别
            fname   : 'name',   // 原数据需要展示的字段名称
            fval    : 'code',   // 原数据需要提交的字段名称
            id      : $('#area'),   // 联动HTML 存放的div容器对象
            fromname: 'area',       // 提交表单的字段名称
            callfunc: '',           // 每次选择时触发率时的回调函数
        };
        $.extend(true, c, o);
        this.config = c;
        
        var event = {
            getPost : function ( url , data , bakFunc ){
                $.post(url,data,function(data,status){
                    if( status == 'success'){
                        if( data.code == 0 )  return showMsg(data.msg);
                        if( typeof bakFunc === 'function') bakFunc(data);
                    }else{
                        showMsg('网络异常,请检查网络后重试');
                    }
                },'json');
            },
            
            // 设置值
            setVal : function(key,val,depth){
                if( typeof depth === 'undefined'){
                    sysc[key] = val;
                }else{
                    for( i = 1; i<=sysc[key].length ; i++ ){
                        if( i >= depth  ){
                           delete sysc[key][i];
                        }
                    }
                    sysc[key][depth] = val;
                }
            },
            // 取值
            getVal : function(key,depth){
                if( Object.prototype.toString.call( sysc[key] ) === '[object String]'){
                    return sysc[key];
                }
                if( Object.prototype.toString.call( sysc[key] ) === '[object Array]' && typeof depth !== 'undefined' ){
                    return sysc[key][depth]
                }else{
                    var str = '';
                    $.each(sysc[key],function(k,val){
                        if( typeof val !== 'undefined' ) str += val + ' ';
                    });
                    return str;
                }
            },
            
            //判断是否有设置默认值
            getDefVal:function(depth){
                if( c.defval.length > 0 && typeof c.defval[depth] != 'undefined'){
                    var val = c.defval[depth];
                    delete c.defval[depth];
                    return val;
                }else{
                    return false;
                }
            },
            
            showHtml:function(data,depth){
                var vallist = data.list ? data.list : data;
                if( vallist.length == 0 ) return false;
                var fromName = c.fromname+depth;
                var html = '<div style="width: 120px;" class="linkselecthtml layui-input-inline JS_links_'+c.fromname+'"><select lay-filter="'+fromName+'" name="'+fromName+'"><option value="0">'+c.defname[depth-1]+'</option>';
                var defVal = event.getDefVal(depth-1);
                var defName = '';
                for (var i = 0; i < vallist.length; i++) {
                    var seleJs = '';
                    if( defVal == vallist[i][c.fval] ){
                        seleJs  = 'selected';
                        defName = vallist[i][c.fname] ;
                    }
                    html += '<option '+seleJs+' value="' + vallist[i][c.fval] + '">' + vallist[i][c.fname] + '</option>';
                }
                html += '</select></div>';
                c.id.append(html);
                form.render();
                
                
                // 选择的事件处理
                form.on('select('+fromName+')', function (data) {
                    if(data.value == '' ){
                        $(data.elem).parents('div.linkselecthtml').nextAll().remove();
                        return false;
                    }
                    event.setVal('gVal',data.value,depth);
                    event.setVal('gName',$(data.elem).find("option:selected").text(),depth);
                   // var str = event.getVal('gVal');
                    
                    if( depth < c.depth ){
                        // 请求下级数据
                        var postParam = c.urlparam;
                        var This = $(this);
                        postParam[c.urlpid] = data.value;
                        event.getPost(c.url,postParam,function(a){
                            $(data.elem).parents('div.linkselecthtml').nextAll().remove();
                            event.showHtml(a,depth+1);
                        });
                    }
                    if(typeof c.callfunc == 'function') c.callfunc(data,depth);
                    
                });
                
                // 设置默认值
                if( defVal!== false  && defName !== ''){
                    event.setVal('gVal',defVal,depth);
                    event.setVal('gName',defName,depth);
                    if( depth < c.depth ){
                        // 请求下级数据
                        var postParam = c.urlparam;
                        var This = $(this);
                        postParam[c.urlpid] = defVal;
                        event.getPost(c.url,postParam,function(a){
                            event.showHtml(a,depth+1);
                        });
                    }
                }
            }
        };
        
        this.getPost = event.getPost;
        this.showHtml = event.showHtml;
    }
    
    
    var linkSelect = {
        setConfig : function(o){
            var e = new eventObject(o);
            e.getPost(e.config.url,e.config.urlparam,function(a){
                e.showHtml(a,1);
            });
            return e;
        },
        remove:function(e){
            e.config.id.find('div.JS_links_'+c.fromname+'').remove();
        }
    };
    
    exports("linkSelect",linkSelect);
})